home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / mus / misc / P6102.lha / Player6.1A / Source / 610.2_devpac3.asm next >
Assembly Source File  |  1995-06-22  |  41KB  |  2,596 lines

  1. * The Player 6.1A for Devpac 3 (and later ;) *
  2. * NEEDS:
  3. *        Default sizes must be words (ASM-One default...)
  4. *        Preferably no optimizations on (the jump table must be word jumps)
  5. * Tested with Devpac 3.04
  6.         
  7. ;start = 6    ;Starting position
  8.  
  9. fade  = 1    ;0 = Normal, NO master volume control possible
  10.         ;1 = Use master volume (P61_Master)
  11.  
  12. jump = 1    ;0 = do NOT include position jump code (P61_SetPosition)
  13.         ;1 = Include
  14.  
  15. system = 1    ;0 = killer
  16.         ;1 = friendly
  17.  
  18. CIA = 1        ;0 = CIA disabled
  19.         ;1 = CIA enabled
  20.  
  21. exec = 1    ;0 = ExecBase destroyed
  22.         ;1 = ExecBase valid
  23.  
  24. lev6 = 1    ;0 = NonLev6
  25.         ;1 = Lev6 used
  26.  
  27. opt020 = 0    ;0 = MC680x0 code
  28.         ;1 = MC68020+ or better
  29.  
  30. channels = 4    ;amount of channels to be played
  31.  
  32. use = -1    ;The Usecode
  33.  
  34.     incdir    include:
  35.     include Player61.i
  36.  
  37.  
  38.     section    Player6.1A,code
  39.  
  40.     movem.l    d0-a6,-(sp)
  41.     lea    $dff000,a6
  42.     ifeq    system
  43.     move    $1c(a6),-(sp)
  44.     move    #$7fff,$9a(a6)
  45.     move    2(a6),-(sp)
  46.     move    #$7ff,$96(a6)
  47.     endc
  48.  
  49.     lea    P61_data,a0    ;Module
  50.     sub.l    a1,a1        ;No separate samples
  51. ;    lea    P61_smp,a1    ;Samples
  52.  
  53.     lea    samples,a2    ;Sample buffer
  54.     moveq    #0,d0        ;Auto Detect
  55.     bsr    P61_motuuli+P61_InitOffset
  56.  
  57.     tst    d0        ;Went ok?
  58.     bne    P61_exit
  59.  
  60. P61_sync
  61.     ifeq    CIA
  62.     move.l    4(a6),d0
  63.     andi.l    #$1ff00,d0
  64.     cmp.l    #$8100,d0
  65.     bne.b    P61_sync
  66.  
  67. P61_sync2
  68.     move.l    4(a6),d0
  69.     andi.l    #$1ff00,d0
  70.     cmp.l    #$8200,d0
  71.     bne.b    P61_sync2
  72.  
  73.     move    #$fff,$180(a6)
  74.     bsr    P61_motuuli+P61_MusicOffset
  75.     clr    $180(a6)
  76.  
  77.     moveq    #0,d0
  78.     move    6(a6),d0
  79.     sub.l    #$8200,d0
  80.     cmp.l    P61_raster(pc),d0
  81.     ble.b    P61_kosj
  82.     move    d0,P61_raster+2
  83. P61_kosj
  84.     tst    P61_raster2+2
  85.     bne.b    P61_doing
  86.     move    d0,P61_raster2+2
  87.     bra.b    P61_doneg
  88. P61_doing
  89.     add.l    P61_raster2(pc),d0
  90.     asr.l    #1,d0
  91.     move.l    d0,P61_raster2
  92. P61_doneg
  93.     addq.l    #1,P61_frames
  94.  
  95.     ifne    fade
  96.     btst    #2,$16(a6)
  97.     bne.b    P61_jid
  98.     move    P61_diri(pc),d0
  99.     sub    d0,P61_motuuli+P61_MasterVolume
  100.     bne.b    P61_judo
  101.     neg    P61_diri
  102.     bra.b    P61_jid
  103. P61_judo
  104.     cmp    #64,P61_motuuli+P61_MasterVolume
  105.     bne.b    P61_jid
  106.     neg    P61_diri
  107.     endc
  108.  
  109. P61_jid
  110.     endc
  111.  
  112.     btst    #6,$bfe001
  113.     bne    P61_sync
  114.  
  115. P61_exit
  116.     bsr    P61_motuuli+P61_EndOffset
  117.  
  118.     ifeq    system
  119.     move    (sp)+,d7
  120.     bset    #15,d7
  121.     move    #$7ff,$96(a6)
  122.     move    d7,$96(a6)
  123.  
  124.     move    (sp)+,d7
  125.     bset    #15,d7
  126.     move    #$7fff,$9a(a6)
  127.     move    d7,$9a(a6)
  128.     endc
  129.     movem.l    (sp)+,d0-a6
  130.  
  131.     move.l    P61_raster(pc),d0
  132.     move.l    P61_raster2(pc),d1
  133.     move.l    P61_frames(pc),d2
  134.     move.l    P61_positionbase(pc),a0
  135.     move.l    P61_patternbase(pc),a1
  136.     move.l    P61_spos(pc),a2
  137.     rts
  138.  
  139. P61_IRQsave    dc    0
  140. P61_DMAsave    dc    0
  141. P61_raster    dc.l    0
  142. P61_raster2    dc.l    0
  143. P61_frames    dc.l    0
  144. P61_diri    dc    1
  145.  
  146. *********************************
  147. *        Player 6.1A ®        *
  148. *      All in one-version    *
  149. *        Version 610.2        *
  150. *   © 1992-95 Jarno Paananen    *
  151. *     All rights reserved    *
  152. *********************************
  153.  
  154.  
  155. ******** START OF BINARY FILE **************
  156.  
  157. P61_motuuli
  158.     bra.w    P61_Init
  159.     ifeq    CIA
  160.     bra.w    P61_Music
  161.     else
  162.     rts
  163.     rts
  164.     endc
  165.     bra.w    P61_End
  166.     rts                ;no P61_SetRepeat
  167.     rts
  168.     bra.w    P61_SetPosition
  169.  
  170. P61_Master    dc    64        ;Master volume (0-64)
  171. P61_Tempo    dc    1        ;Use tempo? 0=no,non-zero=yes
  172. P61_Play    dc    1        ;Stop flag (0=stop)
  173. P61_E8        dc    0        ;Info nybble after command E8
  174. P61_VBR        dc.l    0        ;If you're using non-valid execbase
  175.                     ;put VBR here! (Otherwise 0 assumed)
  176.                     ;You can also get VBR from here, if
  177.                     ;using exec-valid version
  178.  
  179. P61_Pos        dc    0        ;Current song position
  180. P61_Patt    dc    0        ;Current pattern
  181. P61_CRow    dc    0        ;Current pattern row
  182.  
  183. P61_Temp0Offset
  184.     dc.l    P61_temp0-P61_motuuli
  185. P61_Temp1Offset
  186.     dc.l    P61_temp1-P61_motuuli
  187. P61_Temp2Offset
  188.     dc.l    P61_temp2-P61_motuuli
  189. P61_Temp3Offset
  190.     dc.l    P61_temp3-P61_motuuli
  191.  
  192. P61_getnote    macro
  193.     moveq    #$7e,d0
  194.     and.b    (a5),d0
  195.     beq.b    .nonote
  196.     ifne    P61_vib
  197.     clr.b    P61_VibPos(a5)
  198.     endc
  199.     ifne    P61_tre
  200.     clr.b    P61_TrePos(a5)
  201.     endc
  202.  
  203.     ifne    P61_ft
  204.     add    P61_Fine(a5),d0
  205.     endc
  206.     move    d0,P61_Note(a5)
  207.     move    (a2,d0),P61_Period(a5)
  208.  
  209. .nonote
  210.     endm
  211.  
  212.     ifeq    system
  213.     ifne    CIA
  214. P61_intti
  215.     movem.l    d0-a6,-(sp)
  216.     tst.b    $bfdd00
  217.     lea    $dff000,a6
  218.     move    #$2000,$9c(a6)
  219. ;    move    #$fff,$180(a6)
  220.     bsr    P61_Music
  221. ;    move    #0,$180(a6)
  222.     movem.l    (sp)+,d0-a6
  223.     nop
  224.     rte
  225.     endc
  226.     endc
  227.  
  228.     ifne    system
  229. P61_lev6server
  230.     movem.l    d2-d7/a2-a6,-(sp)
  231.     lea    P61_timeron(pc),a0
  232.     tst    (a0)
  233.     beq.b    P61_ohi
  234.  
  235.     lea    $dff000,a6
  236.     move    P61_server(pc),d0
  237.     beq.b    P61_musica
  238.     subq    #1,d0
  239.     beq    P61_dmason
  240.     bra    P61_setrepeat
  241.  
  242. P61_musica
  243.     bsr    P61_Music
  244.  
  245. P61_ohi    movem.l    (sp)+,d2-d7/a2-a6
  246.     moveq    #1,d0
  247.     rts
  248.     endc
  249.  
  250. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  251. ;­ Call P61_Init to initialize the playroutine    ­
  252. ;­ D0 --> Timer detection (for CIA-version)    ­
  253. ;­ A0 --> Address to the module            ­
  254. ;­ A1 --> Address to samples/0 if in the module    ­
  255. ;­ A2 --> Address to sample buffer        ­
  256. ;­ D0 <-- 0 if succeeded            ­
  257. ;­ A6 <-- $DFF000                ­
  258. ;­         Uses D0-A6            ­
  259. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  260.  
  261. P61_Init
  262.     cmp.l    #"P61A",(a0)+
  263.     beq.b    .modok
  264.     subq.l    #4,a0
  265.  
  266. .modok
  267.     ifne    CIA
  268.     move    d0,-(sp)
  269.     endc
  270.  
  271.     moveq    #0,d0
  272.     cmp.l    d0,a1
  273.     bne.b    .redirect
  274.  
  275.     move    (a0),d0
  276.     lea    (a0,d0.l),a1
  277. .redirect
  278.     move.l    a2,a6
  279.     lea    8(a0),a2
  280.     moveq    #$40,d0
  281.     and.b    3(a0),d0
  282.     bne.b    .buffer
  283.     move.l    a1,a6
  284.     subq.l    #4,a2
  285. .buffer
  286.  
  287.     lea    P61_cn(pc),a3
  288.     moveq    #$1f,d1
  289.     and.b    3(a0),d1
  290.     move.l    a0,-(sp)
  291.     lea    P61_samples(pc),a4
  292.     subq    #1,d1
  293.     moveq    #0,d4
  294. P61_lopos
  295.     move.l    a6,(a4)+
  296.     move    (a2)+,d4
  297.     bpl.b    P61_kook
  298.     neg    d4
  299.     lea    P61_samples-16(pc),a5
  300.     ifeq    opt020
  301.     asl    #4,d4
  302.     move.l    (a5,d4),d6
  303.     else
  304.     add    d4,d4
  305.     move.l    (a5,d4*8),d6
  306.     endc
  307.     move.l    d6,-4(a4)
  308.     move    4(a5,d4),d4
  309.     sub.l    d4,a6
  310.     sub.l    d4,a6
  311.     bra.b    P61_jatk
  312.  
  313. P61_kook
  314.     move.l    a6,d6
  315.     tst.b    3(a0)
  316.     bpl.b    P61_jatk
  317.  
  318.     tst.b    (a2)
  319.     bmi.b    P61_jatk
  320.  
  321.     move    d4,d0
  322.     subq    #2,d0
  323.     bmi.b    P61_jatk
  324.  
  325.     move.l    a1,a5
  326.     move.b    (a5)+,d2
  327.     sub.b    (a5),d2
  328.     move.b    d2,(a5)+
  329. .loop    sub.b    (a5),d2
  330.     move.b    d2,(a5)+
  331.     sub.b    (a5),d2
  332.     move.b    d2,(a5)+
  333.     dbf    d0,.loop
  334.  
  335. P61_jatk
  336.     move    d4,(a4)+
  337.     moveq    #0,d2
  338.     move.b    (a2)+,d2
  339.     moveq    #0,d3
  340.     move.b    (a2)+,d3
  341.  
  342.     moveq    #0,d0
  343.     move    (a2)+,d0
  344.     bmi.b    .norepeat
  345.  
  346.     move    d4,d5
  347.     sub    d0,d5
  348.     move.l    d6,a5
  349.  
  350.     add.l    d0,a5
  351.     add.l    d0,a5
  352.  
  353.     move.l    a5,(a4)+
  354.     move    d5,(a4)+
  355.     bra.b    P61_gene
  356. .norepeat
  357.     move.l    d6,(a4)+
  358.     move    #1,(a4)+
  359. P61_gene
  360.     move    d3,(a4)+
  361.     moveq    #$f,d0
  362.     and    d2,d0
  363.     mulu    #74,d0
  364.     move    d0,(a4)+
  365.  
  366.     tst    -6(a2)
  367.     bmi.b    .nobuffer
  368.  
  369.     moveq    #$40,d0
  370.     and.b    3(a0),d0
  371.     beq.b    .nobuffer
  372.  
  373.     move    d4,d7
  374.     tst.b    d2
  375.     bpl.b    .copy
  376.  
  377.     subq    #1,d7
  378.     moveq    #0,d5
  379.     moveq    #0,d4
  380. .lo    move.b    (a1)+,d4
  381.     moveq    #$f,d3
  382.     and    d4,d3
  383.     lsr    #4,d4
  384.  
  385.     sub.b    .table(pc,d4),d5
  386.     move.b    d5,(a6)+
  387.     sub.b    .table(pc,d3),d5
  388.     move.b    d5,(a6)+
  389.     dbf    d7,.lo
  390.     bra.b    .kop
  391.  
  392. .copy    add    d7,d7
  393.     subq    #1,d7
  394. .cob    move.b    (a1)+,(a6)+
  395.     dbf    d7,.cob
  396.     bra.b    .kop
  397.  
  398. .table dc.b    0,1,2,4,8,16,32,64,128,-64,-32,-16,-8,-4,-2,-1
  399.  
  400. .nobuffer
  401.     move.l    d4,d6
  402.     add.l    d6,d6
  403.     add.l    d6,a6
  404.     add.l    d6,a1
  405. .kop    dbf    d1,P61_lopos
  406.  
  407.     move.l    (sp)+,a0
  408.     and.b    #$7f,3(a0)
  409.  
  410.     move.l    a2,-(sp)
  411.  
  412.     lea    P61_temp0(pc),a1
  413.     lea    P61_temp1(pc),a2
  414.     lea    P61_temp2(pc),a4
  415.     lea    P61_temp3(pc),a5
  416.     moveq    #Channel_Block_SIZE/2-2,d0
  417.  
  418.     moveq    #0,d1
  419. .cl    move    d1,(a1)+
  420.     move    d1,(a2)+
  421.     move    d1,(a4)+
  422.     move    d1,(a5)+
  423.     dbf    d0,.cl
  424.  
  425.     lea    P61_temp0-P61_cn(a3),a1
  426.     lea    P61_emptysample-P61_cn(a3),a2
  427.     moveq    #channels-1,d0
  428. .loo    move.l    a2,P61_Sample(a2)
  429.     dbf    d0,.loo
  430.  
  431.     move.l    (sp)+,a2
  432.     move.l    a2,P61_positionbase-P61_cn(a3)
  433.  
  434.     moveq    #$7f,d1
  435.     and.b    2(a0),d1
  436.  
  437.     ifeq    opt020
  438.     lsl    #3,d1
  439.     lea    (a2,d1.l),a4
  440.     else
  441.     lea    (a2,d1.l*8),a4
  442.     endc
  443.     move.l    a4,P61_possibase-P61_cn(a3)
  444.  
  445.     move.l    a4,a1
  446.     moveq    #-1,d0
  447. .search    cmp.b    (a1)+,d0
  448.     bne.b    .search
  449.     move.l    a1,P61_patternbase-P61_cn(a3)    
  450.     move.l    a1,d0
  451.     sub.l    a4,d0
  452.     move    d0,P61_slen-P61_cn(a3)
  453.  
  454.     ifd    start
  455.     lea    start(a4),a4
  456.     endc
  457.  
  458.     moveq    #0,d0
  459.     move.b    (a4)+,d0
  460.     move.l    a4,P61_spos-P61_cn(a3)
  461.     lsl    #3,d0
  462.     add.l    d0,a2
  463.  
  464.     move.l    a1,a4
  465.     moveq    #0,d0    
  466.     move    (a2)+,d0
  467.     lea    (a4,d0.l),a1
  468.     move.l    a1,P61_ChaPos+P61_temp0-P61_cn(a3)
  469.     move    (a2)+,d0
  470.     lea    (a4,d0.l),a1
  471.     move.l    a1,P61_ChaPos+P61_temp1-P61_cn(a3)
  472.     move    (a2)+,d0
  473.     lea    (a4,d0.l),a1
  474.     move.l    a1,P61_ChaPos+P61_temp2-P61_cn(a3)
  475.     move    (a2)+,d0
  476.     lea    (a4,d0.l),a1
  477.     move.l    a1,P61_ChaPos+P61_temp3-P61_cn(a3)
  478.  
  479.     lea    P61_setrepeat(pc),a0
  480.     move.l    a0,P61_intaddr-P61_cn(a3)
  481.  
  482.     move    #63,P61_rowpos-P61_cn(a3)
  483.     move    #6,P61_speed-P61_cn(a3)
  484.     move    #5,P61_speed2-P61_cn(a3)
  485.     clr    P61_speedis1-P61_cn(a3)
  486.  
  487.     ifne    P61_pl
  488.     clr.l    P61_plcount-P61_cn(a3)
  489.     endc
  490.  
  491.     ifne    P61_pde
  492.     clr    P61_pdelay-P61_cn(a3)
  493.     clr    P61_pdflag-P61_cn(a3)
  494.     endc
  495.     clr    (a3)
  496.  
  497.     moveq    #2,d0
  498.     and.b    $bfe001,d0
  499.     move.b    d0,P61_ofilter-P61_cn(a3)
  500.     bset    #1,$bfe001
  501.  
  502.     ifeq    system
  503.     ifne    exec
  504.     move.l    4.w,a6
  505.     moveq    #0,d0
  506.     btst    d0,297(a6)
  507.     beq.b    .no68010
  508.  
  509.     lea    P61_liko(pc),a5
  510.     jsr    -$1e(a6)
  511.  
  512. .no68010
  513.     move.l    d0,P61_VBR-P61_cn(a3)
  514.     endc
  515.  
  516.     move.l    P61_VBR-P61_cn(a3),a0
  517.     lea    $78(a0),a0
  518.     move.l    a0,P61_vektori-P61_cn(a3)
  519.  
  520.     move.l    (a0),P61_oldlev6-P61_cn(a3)
  521.     lea    P61_dmason(pc),a1
  522.     move.l    a1,(a0)
  523.     endc
  524.  
  525.     moveq    #0,d0
  526.     lea    $dff000,a6
  527.     move    d0,$a8(a6)
  528.     move    d0,$b8(a6)
  529.     move    d0,$c8(a6)
  530.     move    d0,$d8(a6)
  531.     move    #$f,$96(a6)
  532.  
  533.     ifeq    system
  534.     lea    P61_dmason(pc),a1
  535.     move.l    a1,(a0)
  536.     move    #$2000,$9a(a6)
  537.     lea    $bfd000,a0
  538.     lea    P61_timers(pc),a1
  539.     move.b    #$7f,$d00(a0)
  540.     move.b    #$10,$e00(a0)
  541.     move.b    #$10,$f00(a0)
  542.     move.b    $400(a0),(a1)+
  543.     move.b    $500(a0),(a1)+
  544.     move.b    $600(a0),(a1)+
  545.     move.b    $700(a0),(a1)
  546.     endc
  547.  
  548.     ifeq    system!CIA
  549.     move.b    #$82,$d00(a0)
  550.     endc
  551.  
  552.     ifne    CIA
  553.     move    (sp)+,d0
  554.     subq    #1,d0
  555.     beq.b    P61_ForcePAL
  556.     subq    #1,d0
  557.     beq.b    P61_NTSC
  558.     ifne    exec
  559.     move.l    4.w,a1
  560.     cmp.b    #60,$213(a1)    ;PowerSupplyFrequency
  561.     beq.b    P61_NTSC
  562.     endc
  563. P61_ForcePAL
  564.     move.l    #1773447,d0    ;PAL
  565.     bra.b    P61_setcia
  566. P61_NTSC
  567.     move.l    #1789773,d0    ;NTSC
  568. P61_setcia
  569.     move.l    d0,P61_timer-P61_cn(a3)
  570.     divu    #125,d0
  571.     move    d0,P61_thi2-P61_cn(a3)
  572.     sub    #$1f0*2,d0
  573.     move    d0,P61_thi-P61_cn(a3)
  574.  
  575.     ifeq    system
  576.     move    P61_thi2-P61_cn(a3),d0
  577.     move.b    d0,$400(a0)
  578.     lsr    #8,d0
  579.     move.b    d0,$500(a0)
  580.     lea    P61_intti(pc),a1
  581.     move.l    a1,P61_tintti-P61_cn(a3)
  582.     move.l    P61_vektori(pc),a2
  583.     move.l    a1,(a2)
  584.     move.b    #$83,$d00(a0)
  585.     move.b    #$11,$e00(a0)
  586.     endc
  587.     endc
  588.  
  589.     ifeq    system
  590.     move    #$e000,$9a(a6)
  591.     moveq    #0,d0
  592.     rts
  593.  
  594.     ifne    exec
  595. P61_liko
  596.     dc.l    $4E7A0801        ;MOVEC    VBR,d0
  597.     rte
  598.     endc
  599.     endc
  600.  
  601.     ifne    system
  602.     move.l    a6,-(sp)
  603.  
  604.     ifne    CIA
  605.     clr    P61_server-P61_cn(a3)
  606.     else
  607.     move    #1,P61_server-P61_cn(a3)
  608.     endc
  609.  
  610.     move.l    4.w,a6
  611.     moveq    #-1,d0
  612.     jsr    -$14a(a6)
  613.     move.b    d0,P61_sigbit-P61_cn(a3)
  614.     bmi    P61_err
  615.  
  616.     lea    P61_allocport(pc),a1
  617.     move.l    a1,P61_portti-P61_cn(a3)
  618.     move.b    d0,15(a1)
  619.     move.l    a1,-(sp)
  620.     suba.l    a1,a1
  621.     jsr    -$126(a6)
  622.     move.l    (sp)+,a1
  623.     move.l    d0,16(a1)
  624.     lea    P61_reqlist(pc),a0
  625.     move.l    a0,(a0)
  626.     addq.l    #4,(a0)
  627.     clr.l    4(a0)
  628.     move.l    a0,8(a0)
  629.  
  630.     lea    P61_dat(pc),a1
  631.     move.l    a1,P61_reqdata-P61_cn(a3)
  632.     lea    P61_allocreq(pc),a1
  633.     lea    P61_audiodev(pc),a0
  634.     moveq    #0,d0
  635.     moveq    #0,d1
  636.     jsr    -$1bc(a6)
  637.     tst.l    d0
  638.     bne    P61_err
  639.     st.b    P61_audioopen-P61_cn(a3)
  640.  
  641.     lea    P61_timerint(pc),a1
  642.     move.l    a1,P61_timerdata-P61_cn(a3)
  643.     lea    P61_lev6server(pc),a1
  644.     move.l    a1,P61_timerdata+8-P61_cn(a3)
  645.  
  646.     moveq    #0,d3
  647.     lea    P61_cianame(pc),a1
  648. P61_openciares
  649.     moveq    #0,d0
  650.     move.l    4.w,a6
  651.     jsr    -$1f2(a6)
  652.     move.l    d0,P61_ciares-P61_cn(a3)
  653.     beq.b    P61_err
  654.     move.l    d0,a6
  655.     lea    P61_timerinterrupt(pc),a1
  656.     moveq    #0,d0
  657.     jsr    -6(a6)
  658.     tst.l    d0
  659.     beq.b    P61_gottimer
  660.     addq.l    #4,d3
  661.     lea    P61_timerinterrupt(pc),a1
  662.     moveq    #1,d0
  663.     jsr    -6(a6)
  664.     tst.l    d0
  665.     bne.b    P61_err
  666.  
  667. P61_gottimer
  668.     lea    P61_craddr+8(pc),a6
  669.     move.l    P61_ciaaddr(pc,d3),d0
  670.     move.l    d0,(a6)
  671.     sub    #$100,d0
  672.     move.l    d0,-(a6)
  673.     moveq    #2,d3
  674.     btst    #9,d0
  675.     bne.b    P61_timerB
  676.     subq.b    #1,d3
  677.     add    #$100,d0
  678. P61_timerB
  679.     add    #$900,d0
  680.     move.l    d0,-(a6)
  681.     move.l    d0,a0
  682.     and.b    #%10000000,(a0)
  683.     move.b    d3,P61_timeropen-P61_cn(a3)
  684.     moveq    #0,d0
  685.     ifne    CIA
  686.     move.l    P61_craddr+4(pc),a1
  687.     move.b    P61_tlo(pc),(a1)
  688.     move.b    P61_thi(pc),$100(a1)
  689.     endc
  690.     or.b    #$19,(a0)
  691.     st    P61_timeron-P61_cn(a3)
  692. P61_pois
  693.     move.l    (sp)+,a6
  694.     rts
  695.  
  696. P61_err    moveq    #-1,d0
  697.     bra.b    P61_pois
  698.     rts
  699.  
  700. P61_ciaaddr
  701.     dc.l    $bfd500,$bfd700
  702.     endc
  703.  
  704. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  705. ;­         Call P61_End to stop the music        ­
  706. ;­   A6 --> Customchip baseaddress ($DFF000)    ­
  707. ;­        Uses D0/D1/A0/A1/A3        ­
  708. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  709.  
  710. P61_End    moveq    #0,d0
  711.     move    d0,$a8(a6)
  712.     move    d0,$b8(a6)
  713.     move    d0,$c8(a6)
  714.     move    d0,$d8(a6)
  715.     move    #$f,$96(a6)
  716.  
  717.     and.b    #~2,$bfe001
  718.     move.b    P61_ofilter(pc),d0
  719.     or.b    d0,$bfe001
  720.  
  721.     ifeq    system
  722.     move    #$2000,$9a(a6)
  723.     move.l    P61_vektori(pc),a0
  724.     move.l    P61_oldlev6(pc),(a0)
  725.     lea    $bfd000,a0
  726.     lea    P61_timers(pc),a1
  727.     move.b    (a1)+,$400(a0)
  728.     move.b    (a1)+,$500(a0)
  729.     move.b    (a1)+,$600(a0)
  730.     move.b    (a1)+,$700(a0)
  731.     move.b    #$10,$e00(a0)
  732.     move.b    #$10,$f00(a0)
  733.  
  734.     else
  735.  
  736.     clr    P61_timeron-P61_cn(a3)
  737.     move.l    a6,-(sp)
  738.     lea    P61_cn(pc),a3
  739.     moveq    #0,d0
  740.     move.b    P61_timeropen(pc),d0
  741.     beq.b    P61_rem1
  742.     move.l    P61_ciares(pc),a6
  743.     lea    P61_timerinterrupt(pc),a1
  744.     subq.b    #1,d0
  745.     jsr    -12(a6)
  746. P61_rem1
  747.     move.l    4.w,a6
  748.     tst.b    P61_audioopen-P61_cn(a3)
  749.     beq.b    P61_rem2
  750.     lea    P61_allocreq(pc),a1
  751.     jsr    -$1c2(a6)
  752.     clr.b    P61_audioopen-P61_cn(a3)
  753. P61_rem2
  754.     moveq    #0,d0
  755.     move.b    P61_sigbit(pc),d0
  756.     bmi.b    P61_rem3
  757.     jsr    -$150(a6)
  758.     st    P61_sigbit-P61_cn(a3)
  759. P61_rem3
  760.     move.l    (sp)+,a6
  761.     endc
  762.     rts
  763.  
  764.     ifne    fade
  765. P61_mfade
  766.     move    P61_Master(pc),d0
  767.     move    P61_temp0+P61_Shadow(pc),d1
  768.     mulu    d0,d1
  769.     lsr    #6,d1
  770.     move    d1,$a8(a6)
  771.  
  772.     ifgt    channels-1
  773.     move    P61_temp1+P61_Shadow(pc),d1
  774.     mulu    d0,d1
  775.     lsr    #6,d1
  776.     move    d1,$b8(a6)
  777.     endc
  778.  
  779.     ifgt    channels-2
  780.     move    P61_temp2+P61_Shadow(pc),d1
  781.     mulu    d0,d1
  782.     lsr    #6,d1
  783.     move    d1,$c8(a6)
  784.     endc
  785.  
  786.     ifgt    channels-3
  787.     move    P61_temp3+P61_Shadow(pc),d1
  788.     mulu    d0,d1
  789.     lsr    #6,d1
  790.     move    d1,$d8(a6)
  791.     endc
  792.     rts
  793.     endc
  794.     
  795.  
  796. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  797. ;­ Call P61_SetPosition to jump to a specific    ­
  798. ;­          position in the song.        ­
  799. ;­ D0.l --> Position                ­
  800. ;­ Starts from the beginning if out of limits.    ­
  801. ;­              Uses A0/A1/A3/D0-D3        ­
  802. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  803.  
  804.     ifne    jump
  805. P61_SetPosition
  806.     lea    P61_cn(pc),a3
  807.     ifne    P61_pl
  808.     clr    P61_plflag-P61_cn(a3)
  809.     endc
  810.     moveq    #0,d1
  811.     move.b    d0,d1
  812.     move.l    d1,d0
  813.     cmp    P61_slen-P61_cn(a3),d0
  814.     blo.b    .e
  815.     moveq    #0,d0
  816. .e    move    d0,P61_Pos-P61_cn(a3)
  817.     add.l    P61_possibase(pc),d0
  818.     move.l    d0,P61_spos-P61_cn(a3)
  819.  
  820.     moveq    #64,d0
  821.     move    d0,P61_rowpos-P61_cn(a3)
  822.     clr    P61_CRow-P61_cn(a3)
  823.     move.l    P61_spos(pc),a1
  824.     move.l    P61_patternbase(pc),a0
  825.     addq    #1,P61_Pos-P61_cn(a3)
  826.     move.b    (a1)+,d0
  827.     move.l    a1,P61_spos-P61_cn(a3)
  828.     move.l    P61_positionbase(pc),a1
  829.     move    d0,P61_Patt-P61_cn(a3)
  830.     lsl    #3,d0
  831.     add.l    d0,a1
  832.     movem    (a1),d0-d3
  833.     lea    (a0,d0.l),a1
  834.     move    d1,d0
  835.     move.l    a1,P61_ChaPos+P61_temp0-P61_cn(a3)
  836.     lea    (a0,d0.l),a1
  837.     move.l    a1,P61_ChaPos+P61_temp1-P61_cn(a3)
  838.     move    d2,d0
  839.     lea    (a0,d0.l),a1
  840.     move.l    a1,P61_ChaPos+P61_temp2-P61_cn(a3)
  841.     move    d3,d0
  842.     add.l    d0,a0
  843.     move.l    a0,P61_ChaPos+P61_temp3-P61_cn(a3)
  844.     rts
  845.     endc
  846.  
  847. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  848. ;­ Call P61_Music every frame to play the music    ­
  849. ;­      _NOT_ if CIA-version is used!        ­
  850. ;­ A6 --> Customchip baseaddress ($DFF000)    ­
  851. ;­              Uses A0-A5/D0-D7        ­
  852. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  853.  
  854. P61_Music
  855.     lea    P61_cn(pc),a3
  856.  
  857.     tst    P61_Play-P61_cn(a3)
  858.     bne.b    P61_ohitaaa
  859.     ifne    CIA
  860.     ifne    system
  861.     move.l    P61_craddr+4(pc),a0
  862.     move.b    P61_tlo2(pc),(a0)
  863.     move.b    P61_thi2(pc),$100(a0)
  864.     endc
  865.     endc
  866.     rts
  867.  
  868. P61_ohitaaa
  869.     ifne    fade
  870.     pea    P61_mfade(pc)
  871.     endc
  872.  
  873.     moveq    #Channel_Block_SIZE,d6
  874.     moveq    #16,d7
  875.  
  876.     move    (a3),d4
  877.     addq    #1,d4
  878.     cmp    P61_speed(pc),d4
  879.     beq    P61_playtime
  880.  
  881.     move    d4,(a3)
  882.  
  883. P61_delay
  884.     ifne    CIA
  885.     ifne    system
  886.     move.l    P61_craddr+4(pc),a0
  887.     move.b    P61_tlo2(pc),(a0)
  888.     move.b    P61_thi2(pc),$100(a0)
  889.     endc
  890.     endc
  891.  
  892.     lea    P61_temp0(pc),a5
  893.     lea    $a0(a6),a4
  894.  
  895.     moveq    #channels-1,d5
  896. P61_lopas
  897.     tst    P61_OnOff(a5)
  898.     beq    P61_contfxdone
  899.     moveq    #$f,d0
  900.     and    (a5),d0
  901.     ifeq    opt020
  902.     add    d0,d0
  903.     move    P61_jtab2(pc,d0),d0
  904.     else
  905.     move    P61_jtab2(pc,d0*2),d0
  906.     endc
  907.     jmp    P61_jtab2(pc,d0)
  908.  
  909. P61_jtab2
  910.     dc    P61_contfxdone-P61_jtab2
  911.  
  912.     ifne    P61_pu
  913.     dc    P61_portup-P61_jtab2
  914.     else
  915.     dc    P61_contfxdone-P61_jtab2
  916.     endc
  917.  
  918.     ifne    P61_pd
  919.     dc    P61_portdwn-P61_jtab2
  920.     else
  921.     dc    P61_contfxdone-P61_jtab2
  922.     endc
  923.  
  924.     ifne    P61_tp
  925.     dc    P61_toneport-P61_jtab2
  926.     else
  927.     dc    P61_contfxdone-P61_jtab2
  928.     endc
  929.  
  930.     ifne    P61_vib
  931.     dc    P61_vib2-P61_jtab2
  932.     else
  933.     dc    P61_contfxdone-P61_jtab2
  934.     endc
  935.  
  936.     ifne    P61_tpvs
  937.     dc    P61_tpochvslide-P61_jtab2
  938.     else
  939.     dc    P61_contfxdone-P61_jtab2
  940.     endc
  941.  
  942.     ifne    P61_vbvs
  943.     dc    P61_vibochvslide-P61_jtab2
  944.     else
  945.     dc    P61_contfxdone-P61_jtab2
  946.     endc
  947.  
  948.     ifne    P61_tre
  949.     dc    P61_tremo-P61_jtab2
  950.     else
  951.     dc    P61_contfxdone-P61_jtab2
  952.     endc
  953.  
  954.     ifne    P61_arp
  955.     dc    P61_arpeggio-P61_jtab2
  956.     else
  957.     dc    P61_contfxdone-P61_jtab2
  958.     endc
  959.  
  960.     dc    P61_contfxdone-P61_jtab2
  961.  
  962.     ifne    P61_vs
  963.     dc    P61_volslide-P61_jtab2
  964.     else
  965.     dc    P61_contfxdone-P61_jtab2
  966.     endc
  967.  
  968.     dc    P61_contfxdone-P61_jtab2
  969.     dc    P61_contfxdone-P61_jtab2
  970.     dc    P61_contfxdone-P61_jtab2
  971.  
  972.     ifne    P61_ec
  973.     dc    P61_contecommands-P61_jtab2
  974.     else
  975.     dc    P61_contfxdone-P61_jtab2
  976.     endc
  977.     dc    P61_contfxdone-P61_jtab2
  978.  
  979.     ifne    P61_ec
  980. P61_contecommands
  981.     move.b    P61_Info(a5),d0
  982.     and    #$f0,d0
  983.     lsr    #3,d0
  984.     move    P61_etab2(pc,d0),d0
  985.     jmp    P61_etab2(pc,d0)
  986.  
  987. P61_etab2
  988.     dc    P61_contfxdone-P61_etab2
  989.  
  990.     ifne    P61_fsu
  991.     dc    P61_fineup2-P61_etab2
  992.     else
  993.     dc    P61_contfxdone-P61_etab2
  994.     endc
  995.  
  996.     ifne    P61_fsd
  997.     dc    P61_finedwn2-P61_etab2
  998.     else
  999.     dc    P61_contfxdone-P61_etab2
  1000.     endc
  1001.  
  1002.     dc    P61_contfxdone-P61_etab2
  1003.     dc    P61_contfxdone-P61_etab2
  1004.  
  1005.     dc    P61_contfxdone-P61_etab2
  1006.     dc    P61_contfxdone-P61_etab2
  1007.  
  1008.     dc    P61_contfxdone-P61_etab2
  1009.     dc    P61_contfxdone-P61_etab2
  1010.  
  1011.     ifne    P61_rt
  1012.     dc    P61_retrig-P61_etab2
  1013.     else
  1014.     dc    P61_contfxdone-P61_etab2
  1015.     endc
  1016.  
  1017.     ifne    P61_fvu
  1018.     dc    P61_finevup2-P61_etab2
  1019.     else
  1020.     dc    P61_contfxdone-P61_etab2
  1021.     endc
  1022.  
  1023.     ifne    P61_fvd
  1024.     dc    P61_finevdwn2-P61_etab2
  1025.     else
  1026.     dc    P61_contfxdone-P61_etab2
  1027.     endc
  1028.  
  1029.     ifne    P61_nc
  1030.     dc    P61_notecut-P61_etab2
  1031.     else
  1032.     dc    P61_contfxdone-P61_etab2
  1033.     endc
  1034.  
  1035.     ifne    P61_nd
  1036.     dc    P61_notedelay-P61_etab2
  1037.     else
  1038.     dc    P61_contfxdone-P61_etab2
  1039.     endc
  1040.  
  1041.     dc    P61_contfxdone-P61_etab2
  1042.     dc    P61_contfxdone-P61_etab2
  1043.     endc
  1044.  
  1045.     ifne    P61_fsu
  1046. P61_fineup2
  1047.     tst    (a3)
  1048.     bne    P61_contfxdone
  1049.     moveq    #$f,d0
  1050.     and.b    P61_Info(a5),d0
  1051.     sub    d0,P61_Period(a5)
  1052.     moveq    #113,d0
  1053.     cmp    P61_Period(a5),d0
  1054.     ble.b    .jup
  1055.     move    d0,P61_Period(a5)
  1056. .jup    move    P61_Period(a5),6(a4)
  1057.     bra    P61_contfxdone
  1058.     endc
  1059.  
  1060.     ifne    P61_fsd
  1061. P61_finedwn2
  1062.     tst    (a3)
  1063.     bne    P61_contfxdone
  1064.     moveq    #$f,d0
  1065.     and.b    P61_Info(a5),d0
  1066.     add    d0,P61_Period(a5)
  1067.     cmp    #856,P61_Period(a5)
  1068.     ble.b    .jup
  1069.     move    #856,P61_Period(a5)
  1070. .jup    move    P61_Period(a5),6(a4)
  1071.     bra    P61_contfxdone
  1072.     endc
  1073.  
  1074.     ifne    P61_fvu
  1075. P61_finevup2
  1076.     tst    (a3)
  1077.     bne    P61_contfxdone
  1078.     moveq    #$f,d0
  1079.     and.b    P61_Info(a5),d0
  1080.     add    d0,P61_Volume(a5)
  1081.     moveq    #64,d0
  1082.     cmp    P61_Volume(a5),d0
  1083.     bge.b    .jup
  1084.     move    d0,P61_Volume(a5)
  1085. .jup    move    P61_Volume(a5),8(a4)
  1086.     bra    P61_contfxdone
  1087.     endc
  1088.  
  1089.     ifne    P61_fvd
  1090. P61_finevdwn2
  1091.     tst    (a3)
  1092.     bne    P61_contfxdone
  1093.     moveq    #$f,d0
  1094.     and.b    P61_Info(a5),d0
  1095.     sub    d0,P61_Volume(a5)
  1096.     bpl.b    .jup
  1097.     clr    P61_Volume(a5)
  1098. .jup    move    P61_Volume(a5),8(a4)
  1099.     bra    P61_contfxdone
  1100.     endc
  1101.  
  1102.     ifne    P61_nc
  1103. P61_notecut
  1104.     moveq    #$f,d0
  1105.     and.b    P61_Info(a5),d0
  1106.     cmp    (a3),d0
  1107.     bne    P61_contfxdone
  1108.     ifeq    fade
  1109.     clr    8(a4)
  1110.     else
  1111.     clr    P61_Shadow(a5)
  1112.     endc
  1113.     clr    P61_Volume(a5)
  1114.     bra    P61_contfxdone
  1115.     endc
  1116.  
  1117.     ifne    P61_nd
  1118. P61_notedelay
  1119.     moveq    #$f,d0
  1120.     and.b    P61_Info(a5),d0
  1121.     cmp    (a3),d0
  1122.     bne    P61_contfxdone
  1123.  
  1124.     moveq    #$7e,d0
  1125.     and.b    (a5),d0
  1126.     beq    P61_contfxdone
  1127.     move    P61_DMABit(a5),d0
  1128.     move    d0,$96(a6)
  1129.     or    d0,P61_dma-P61_cn(a3)
  1130.     move.l    P61_Sample(a5),a1        ;* Trigger *
  1131.     move.l    (a1)+,(a4)+            ;Pointer
  1132.     move    (a1),(a4)+            ;Length
  1133.     move    P61_Period(a5),(a4)
  1134.     subq.l    #6,a4
  1135.  
  1136.     ifeq    system
  1137.     lea    P61_dmason(pc),a1
  1138.     move.l    P61_vektori(pc),a0
  1139.     move.l    a1,(a0)
  1140.     move.b    #$f0,$bfd600
  1141.     move.b    #$01,$bfd700
  1142.     move.b    #$19,$bfdf00
  1143.     else
  1144.     move    #1,P61_server-P61_cn(a3)
  1145.     move.l    P61_craddr+4(pc),a1
  1146.     move.b    #$f0,(a1)
  1147.     move.b    #1,$100(a1)
  1148.     endc
  1149.     bra    P61_contfxdone
  1150.     endc
  1151.  
  1152.     ifne    P61_rt
  1153. P61_retrig
  1154.     subq    #1,P61_RetrigCount(a5)
  1155.     bne    P61_contfxdone
  1156.     move    P61_DMABit(a5),d0
  1157.     move    d0,$96(a6)
  1158.     or    d0,P61_dma-P61_cn(a3)
  1159.     move.l    P61_Sample(a5),a1        ;* Trigger *
  1160.     move.l    (a1)+,(a4)            ;Pointer
  1161.     move    (a1),4(a4)            ;Length
  1162.  
  1163.     ifeq    system
  1164.     lea    P61_dmason(pc),a1
  1165.     move.l    P61_vektori(pc),a0
  1166.     move.l    a1,(a0)
  1167.     move.b    #$f0,$bfd600
  1168.     move.b    #$01,$bfd700
  1169.     move.b    #$19,$bfdf00
  1170.     else
  1171.     move    #1,P61_server-P61_cn(a3)
  1172.     move.l    P61_craddr+4(pc),a1
  1173.     move.b    #$f0,(a1)
  1174.     move.b    #1,$100(a1)
  1175.     endc
  1176.  
  1177.     moveq    #$f,d0
  1178.     and.b    P61_Info(a5),d0
  1179.     move    d0,P61_RetrigCount(a5)
  1180.     bra    P61_contfxdone
  1181.     endc
  1182.  
  1183.     ifne    P61_arp
  1184. P61_arplist
  1185.  dc.b 0,1,-1,0,1,-1,0,1,-1,0,1,-1,0,1,-1,0,1,-1,0,1,-1,0,1,-1,0,1,-1,0,1,-1,0,1
  1186.  
  1187. P61_arpeggio
  1188.     move    (a3),d0
  1189.     move.b    P61_arplist(pc,d0),d0
  1190.     beq.b    .arp0
  1191.     bmi.b    .arp1
  1192.  
  1193.     move.b    P61_Info(a5),d0
  1194.     lsr    #4,d0
  1195.     bra.b    .arp3
  1196.  
  1197. .arp0    move    P61_Note(a5),d0
  1198.     move    P61_periods(pc,d0),6(a4)
  1199.     bra    P61_contfxdone
  1200.  
  1201. .arp1    moveq    #$f,d0
  1202.     and.b    P61_Info(a5),d0
  1203.  
  1204. .arp3    add    d0,d0
  1205.     add    P61_Note(a5),d0
  1206.     move    P61_periods(pc,d0),6(a4)
  1207.     bra    P61_contfxdone
  1208.     endc
  1209.  
  1210. P61_periods
  1211.     ifne    P61_ft
  1212.     incbin    periods
  1213.     else
  1214.     incbin    periods.nft
  1215.     endc
  1216.  
  1217.     ifne    P61_vs
  1218. P61_volslide
  1219.     move.b    P61_Info(a5),d0
  1220.     sub.b    d0,P61_Volume+1(a5)
  1221.     bpl.b    .test
  1222.     clr    P61_Volume(a5)
  1223.     ifeq    fade
  1224.     clr    8(a4)
  1225.     else
  1226.     clr    P61_Shadow(a5)
  1227.     endc
  1228.     bra    P61_contfxdone
  1229. .test    moveq    #64,d0
  1230.     cmp    P61_Volume(a5),d0
  1231.     bge.b    .ncs
  1232.     move    d0,P61_Volume(a5)
  1233.     ifeq    fade
  1234.     move    d0,8(a4)
  1235.     else
  1236.     move    d0,P61_Shadow(a5)
  1237.     endc
  1238.     bra.b    P61_contfxdone
  1239. .ncs
  1240.     ifeq    fade
  1241.     move    P61_Volume(a5),8(a4)
  1242.     else
  1243.     move    P61_Volume(a5),P61_Shadow(a5)
  1244.     endc
  1245.     bra.b    P61_contfxdone
  1246.     endc
  1247.  
  1248.     ifne    P61_tpvs
  1249. P61_tpochvslide
  1250.     move.b    P61_Info(a5),d0
  1251.     sub.b    d0,P61_Volume+1(a5)
  1252.     bpl.b    .test
  1253.     clr    P61_Volume(a5)
  1254.     ifeq    fade
  1255.     clr    8(a4)
  1256.     else
  1257.     clr    P61_Shadow(a5)
  1258.     endc
  1259.     bra.b    P61_toneport
  1260. .test    moveq    #64,d0
  1261.     cmp    P61_Volume(a5),d0
  1262.     bge.b    .ncs
  1263.     move    d0,P61_Volume(a5)
  1264. .ncs
  1265.     ifeq    fade
  1266.     move    P61_Volume(a5),8(a4)
  1267.     else
  1268.     move    P61_Volume(a5),P61_Shadow(a5)
  1269.     endc
  1270.     endc
  1271.  
  1272.     ifne    P61_tp
  1273. P61_toneport
  1274.     move    P61_ToPeriod(a5),d0
  1275.     beq.b    P61_contfxdone
  1276.     move    P61_TPSpeed(a5),d1
  1277.     cmp    P61_Period(a5),d0
  1278.     blt.b    .topoup
  1279.  
  1280.     add    d1,P61_Period(a5)
  1281.     cmp    P61_Period(a5),d0
  1282.     bgt.b    .setper
  1283.     move    d0,P61_Period(a5)
  1284.     clr    P61_ToPeriod(a5)
  1285.     move    d0,6(a4)
  1286.     bra.b    P61_contfxdone
  1287.  
  1288. .topoup
  1289.     sub    d1,P61_Period(a5)
  1290.     cmp    P61_Period(a5),d0
  1291.     blt.b    .setper
  1292.     move    d0,P61_Period(a5)
  1293.     clr    P61_ToPeriod(a5)
  1294. .setper
  1295.     move    P61_Period(a5),6(a4)
  1296.     else
  1297.     nop
  1298.     endc
  1299.  
  1300. P61_contfxdone
  1301.     ifne    P61_il
  1302.     bsr    P61_funk2
  1303.     endc
  1304.  
  1305.     add.l    d6,a5
  1306.     add.l    d7,a4
  1307.     dbf    d5,P61_lopas
  1308.  
  1309.     cmp    P61_speed2(pc),d4
  1310.     beq.b    P61_preplay
  1311.     rts
  1312.  
  1313.     ifne    P61_pu
  1314. P61_portup
  1315.     moveq    #0,D0
  1316.     move.b    P61_Info(a5),d0
  1317.     sub    d0,P61_Period(a5)
  1318.     moveq    #113,d0
  1319.     cmp    P61_Period(a5),d0
  1320.     ble.b    .skip
  1321.     move    d0,P61_Period(a5)
  1322.     move    d0,6(a4)
  1323.     bra.b    P61_contfxdone
  1324. .skip
  1325.     move    P61_Period(a5),6(a4)
  1326.     bra.b    P61_contfxdone
  1327.     endc
  1328.  
  1329.     ifne    P61_pd
  1330. P61_portdwn
  1331.     moveq    #0,d0
  1332.     move.b    P61_Info(a5),d0
  1333.     add    d0,P61_Period(a5)
  1334.     cmp    #856,P61_Period(a5)
  1335.     ble.b    .skip
  1336.     move    #856,d0
  1337.     move    d0,P61_Period(a5)
  1338.     move    d0,6(a4)
  1339.     bra.b    P61_contfxdone
  1340. .skip
  1341.     move    P61_Period(a5),6(a4)
  1342.     bra.b    P61_contfxdone
  1343.     endc
  1344.  
  1345.     ifne    P61_pde
  1346. P61_return
  1347.     rts
  1348.  
  1349. P61_preplay
  1350.     tst    P61_pdflag-P61_cn(a3)
  1351.     bne.b    P61_return
  1352.     else
  1353. P61_preplay
  1354.     endc
  1355.  
  1356.     lea    P61_temp0(pc),a5
  1357.     lea    P61_samples-16(pc),a0
  1358.  
  1359.     moveq    #channels-1,d5
  1360. P61_loaps
  1361.     ifne    P61_pl
  1362.     lea    P61_TData(a5),a1
  1363.     move    2(a5),(a1)+
  1364.     move.l    P61_ChaPos(a5),(a1)+
  1365.     move.l    P61_TempPos(a5),(a1)+
  1366.     move    P61_TempLen(a5),(a1)
  1367.     endc
  1368.  
  1369.     move.b    P61_Pack(a5),d0
  1370.     and.b    #$3f,d0
  1371.     beq.b    P61_takeone
  1372.  
  1373.     tst.b    P61_Pack(a5)
  1374.     bmi.b    .keepsame
  1375.  
  1376.     subq.b    #1,P61_Pack(a5)
  1377.     clr    P61_OnOff(a5)            ; Empty row
  1378.     add.l    d6,a5
  1379.     dbf    d5,P61_loaps
  1380.     rts
  1381.  
  1382. .keepsame
  1383.     subq.b    #1,P61_Pack(a5)
  1384.     bra    P61_dko
  1385.  
  1386. P61_takeone
  1387.     tst.b    P61_TempLen+1(a5)
  1388.     beq.b    P61_takenorm
  1389.  
  1390.     subq.b    #1,P61_TempLen+1(a5)
  1391.     move.l    P61_TempPos(a5),a2
  1392.  
  1393. P61_jedi
  1394.     move.b    (a2)+,d0
  1395.     moveq    #%01100000,d1
  1396.     and.b    d0,d1
  1397.     cmp.b    #%01100000,d1
  1398.     bne.b    .all
  1399.  
  1400.     moveq    #%01110000,d1
  1401.     and.b    d0,d1
  1402.     cmp.b    #%01110000,d1
  1403.     bne.b    .cmd
  1404.  
  1405.     moveq    #%01111000,d1
  1406.     and.b    d0,d1
  1407.     cmp.b    #%01111000,d1
  1408.     bne.b    .note
  1409.  
  1410. .empty    clr    P61_OnOff(a5)            ; Empty row
  1411.     clr    (a5)+
  1412.     clr.b    (a5)+
  1413.     tst.b    d0
  1414.     bpl.b    .ex
  1415.     move.b    (a2)+,(a5)            ; Compression info
  1416.     bra.b    .ex
  1417.  
  1418. .all    move.b    d0,(a5)+
  1419.     ifeq    opt020
  1420.     move.b    (a2)+,(a5)+
  1421.     move.b    (a2)+,(a5)+
  1422.     else
  1423.     move    (a2)+,(a5)+
  1424.     endc
  1425.     tst.b    d0
  1426.     bpl.b    .ex
  1427.     move.b    (a2)+,(a5)            ; Compression info
  1428.     bra.b    .ex
  1429.  
  1430. .cmd    moveq    #$f,d1
  1431.     and    d0,d1
  1432.     move    d1,(a5)+            ; cmd
  1433.     move.b    (a2)+,(a5)+            ; info
  1434.     tst.b    d0
  1435.     bpl.b    .ex
  1436.     move.b    (a2)+,(a5)            ; Compression info
  1437.     bra.b    .ex
  1438.  
  1439. .note    moveq    #7,d1
  1440.     and    d0,d1
  1441.     lsl    #8,d1
  1442.     move.b    (a2)+,d1
  1443.     lsl    #4,d1
  1444.     move    d1,(a5)+
  1445.     clr.b    (a5)+    
  1446.     tst.b    d0
  1447.     bpl.b    .ex
  1448.     move.b    (a2)+,(a5)            ; Compression info
  1449. .ex    subq.l    #3,a5
  1450.     move.l    a2,P61_TempPos(a5)
  1451.     bra    P61_dko
  1452.  
  1453.  
  1454. P61_takenorm
  1455.     move.l    P61_ChaPos(a5),a2
  1456.  
  1457.     move.b    (a2)+,d0
  1458.     moveq    #%01100000,d1
  1459.     and.b    d0,d1
  1460.     cmp.b    #%01100000,d1
  1461.     bne.b    .all
  1462.  
  1463.     moveq    #%01110000,d1
  1464.     and.b    d0,d1
  1465.     cmp.b    #%01110000,d1
  1466.     bne.b    .cmd
  1467.  
  1468.     moveq    #%01111000,d1
  1469.     and.b    d0,d1
  1470.     cmp.b    #%01111000,d1
  1471.     bne.b    .note
  1472.  
  1473. .empty    clr    P61_OnOff(a5)            ; Empty row
  1474.     clr    (a5)+
  1475.     clr.b    (a5)+
  1476.     tst.b    d0
  1477.     bpl.b    .proccomp
  1478.     move.b    (a2)+,(a5)            ; Compression info
  1479.     bra.b    .proccomp
  1480.  
  1481.  
  1482. .all    move.b    d0,(a5)+
  1483.     ifeq    opt020
  1484.     move.b    (a2)+,(a5)+
  1485.     move.b    (a2)+,(a5)+
  1486.     else
  1487.     move    (a2)+,(a5)+
  1488.     endc
  1489.     tst.b    d0
  1490.     bpl.b    .proccomp
  1491.     move.b    (a2)+,(a5)            ; Compression info
  1492.     bra.b    .proccomp
  1493.  
  1494. .cmd    moveq    #$f,d1
  1495.     and    d0,d1
  1496.     move    d1,(a5)+            ; cmd
  1497.     move.b    (a2)+,(a5)+            ; info
  1498.     tst.b    d0
  1499.     bpl.b    .proccomp
  1500.     move.b    (a2)+,(a5)            ; Compression info
  1501.     bra.b    .proccomp
  1502.  
  1503. .note    moveq    #7,d1
  1504.     and    d0,d1
  1505.     lsl    #8,d1
  1506.     move.b    (a2)+,d1
  1507.     lsl    #4,d1
  1508.     move    d1,(a5)+
  1509.     clr.b    (a5)+    
  1510.     tst.b    d0
  1511.     bpl.b    .proccomp
  1512.     move.b    (a2)+,(a5)            ; Compression info
  1513.  
  1514. .proccomp
  1515.     subq.l    #3,a5
  1516.     move.l    a2,P61_ChaPos(a5)
  1517.  
  1518.     tst.b    d0
  1519.     bpl.b    P61_dko
  1520.  
  1521.     move.b    3(a5),d0
  1522.     move.b    d0,d1
  1523.     and    #%11000000,d1
  1524.     beq.b    P61_dko                ; Empty datas
  1525.     cmp.b    #%10000000,d1
  1526.     beq.b    P61_dko                ; Same datas
  1527.  
  1528.     clr.b    3(a5)
  1529.     and    #$3f,d0
  1530.     move.b    d0,P61_TempLen+1(a5)
  1531.  
  1532.     cmp.b    #%11000000,d1
  1533.     beq.b    .bit16                ; 16-bit
  1534.  
  1535.     moveq    #0,d0                ; 8-bit
  1536.     move.b    (a2)+,d0
  1537.     move.l    a2,P61_ChaPos(a5)
  1538.     sub.l    d0,a2
  1539.     bra    P61_jedi
  1540.  
  1541. .bit16    moveq    #0,d0
  1542.     ifeq    opt020
  1543.     move.b    (a2)+,d0
  1544.     lsl    #8,d0
  1545.     move.b    (a2)+,d0
  1546.     else
  1547.     move    (a2)+,d0
  1548.     endc
  1549.  
  1550.     move.l    a2,P61_ChaPos(a5)
  1551.     sub.l    d0,a2
  1552.     bra    P61_jedi
  1553.  
  1554.  
  1555. P61_dko    st    P61_OnOff(a5)
  1556.     move    (a5),d0
  1557.     and    #$1f0,d0
  1558.     beq.b    .koto
  1559.     lea    (a0,d0),a1
  1560.     move.l    a1,P61_Sample(a5)
  1561.     ifne    P61_ft
  1562.     move.l    P61_SampleVolume(a1),P61_Volume(a5)
  1563.     else
  1564.     move    P61_SampleVolume(a1),P61_Volume(a5)
  1565.     endc
  1566.     ifne    P61_il
  1567.     move.l    P61_RepeatOffset(a1),P61_Wave(a5)
  1568.     endc
  1569.     ifne    P61_sof
  1570.     clr    P61_Offset(a5)
  1571.     endc
  1572.  
  1573. .koto    add.l    d6,a5
  1574.     dbf    d5,P61_loaps
  1575.     rts
  1576.  
  1577. P61_playtime
  1578.     clr    (a3)
  1579.  
  1580.     ifne    P61_pde
  1581.     tst    P61_pdelay-P61_cn(a3)
  1582.     beq.b    .djdj
  1583.     subq    #1,P61_pdelay-P61_cn(a3)
  1584.     bne    P61_delay
  1585.     tst    P61_speedis1-P61_cn(a3)
  1586.     bne    P61_delay
  1587.     clr    P61_pdflag-P61_cn(a3)
  1588.     bra    P61_delay
  1589. .djdj
  1590.     clr    P61_pdflag-P61_cn(a3)
  1591.     endc
  1592.  
  1593.     tst    P61_speedis1-P61_cn(a3)
  1594.     beq.b    .mo
  1595.     bsr    P61_preplay
  1596.  
  1597. .mo    lea    P61_temp0(pc),a5
  1598.     lea    $a0(a6),a4
  1599.  
  1600.     ifeq    system
  1601.     lea    P61_dmason(pc),a1
  1602.     move.l    P61_vektori(pc),a0
  1603.     move.l    a1,(a0)
  1604.     move.b    #$f0,$bfd600
  1605.     move.b    #$01,$bfd700
  1606.     move.b    #$19,$bfdf00
  1607.     else
  1608.     move    #1,P61_server-P61_cn(a3)
  1609.     move.l    P61_craddr+4(pc),a1
  1610.     move.b    #$f0,(a1)
  1611.     move.b    #1,$100(a1)
  1612.     endc
  1613.  
  1614.     lea    P61_periods(pc),a2
  1615.  
  1616.     moveq    #0,d4
  1617.     moveq    #channels-1,d5
  1618. P61_los    tst    P61_OnOff(a5)
  1619.     beq.b    P61_nocha
  1620.  
  1621.     moveq    #$f,d0
  1622.     and    (a5),d0
  1623.     lea    P61_jtab(pc),a1
  1624.     add    d0,d0
  1625.     add.l    d0,a1
  1626.     add    (a1),a1
  1627.     jmp    (a1)
  1628.  
  1629. P61_fxdone
  1630.     moveq    #$7e,d0
  1631.     and.b    (a5),d0
  1632.     beq.b    P61_nocha
  1633.     ifne    P61_vib
  1634.     clr.b    P61_VibPos(a5)
  1635.     endc
  1636.     ifne    P61_tre
  1637.     clr.b    P61_TrePos(a5)
  1638.     endc
  1639.  
  1640.      ifne    P61_ft
  1641.     add    P61_Fine(a5),d0
  1642.     endc
  1643.     move    d0,P61_Note(a5)
  1644.     move    (a2,d0),P61_Period(a5)
  1645.  
  1646. P61_zample
  1647.     ifne    P61_sof
  1648.     tst    P61_Offset(a5)
  1649.     bne    P61_pek
  1650.     endc
  1651.  
  1652.     or    P61_DMABit(a5),d4
  1653.     move    d4,$96(a6)
  1654.     move.l    P61_Sample(a5),a1        ;* Trigger *
  1655.     move.l    (a1)+,(a4)            ;Pointer
  1656.     move    (a1),4(a4)            ;Length
  1657.  
  1658. P61_nocha
  1659.     ifeq    fade
  1660.     move.l    P61_Period(a5),6(a4)
  1661.     else
  1662.     move    P61_Period(a5),6(a4)
  1663.     move    P61_Volume(a5),P61_Shadow(a5)
  1664.     endc
  1665.  
  1666. P61_skip
  1667.     ifne    P61_il
  1668.     bsr    P61_funk2
  1669.     endc
  1670.  
  1671.     add.l    d6,a5
  1672.     add.l    d7,a4
  1673.     dbf    d5,P61_los
  1674.  
  1675.     move.b    d4,P61_dma+1-P61_cn(a3)
  1676.  
  1677.     ifne    P61_pl
  1678.     tst.b    P61_plflag+1-P61_cn(a3)
  1679.     beq.b    P61_ohittaa
  1680.  
  1681.     lea    P61_temp0(pc),a1
  1682.     lea    P61_looppos(pc),a0
  1683.     moveq    #channels-1,d0
  1684. .talt    move.b    1(a0),3(a1)
  1685.     addq.l    #2,a0
  1686.     move.l    (a0)+,P61_ChaPos(a1)
  1687.     move.l    (a0)+,P61_TempPos(a1)
  1688.     move    (a0)+,P61_TempLen(a1)
  1689.     add.l    d6,a1
  1690.     dbf    d0,.talt
  1691.  
  1692.     move    P61_plrowpos(pc),P61_rowpos-P61_cn(a3)
  1693.     clr.b    P61_plflag+1-P61_cn(a3)
  1694.     moveq    #63,d0
  1695.     sub    P61_rowpos-P61_cn(a3),d0
  1696.     move    d0,P61_CRow-P61_cn(a3)
  1697.     rts
  1698.     endc
  1699.  
  1700. P61_ohittaa
  1701.     subq    #1,P61_rowpos-P61_cn(a3)
  1702.     bmi.b    P61_nextpattern
  1703.     moveq    #63,d0
  1704.     sub    P61_rowpos-P61_cn(a3),d0
  1705.     move    d0,P61_CRow-P61_cn(a3)
  1706.     rts
  1707.  
  1708. P61_nextpattern
  1709.     ifne    P61_pl
  1710.     clr    P61_plflag-P61_cn(a3)
  1711.     endc
  1712.     move.l    P61_patternbase(pc),a4
  1713.     moveq    #63,d0
  1714.     move    d0,P61_rowpos-P61_cn(a3)
  1715.     clr    P61_CRow-P61_cn(a3)
  1716.     move.l    P61_spos(pc),a1
  1717.     addq    #1,P61_Pos-P61_cn(a3)
  1718.     move.b    (a1)+,d0
  1719.     bpl.b    P61_dk
  1720.     move.l    P61_possibase(pc),a1
  1721.     move.b    (a1)+,d0
  1722.     clr    P61_Pos-P61_cn(a3)
  1723. P61_dk    move.l    a1,P61_spos-P61_cn(a3)
  1724.     move    d0,P61_Patt-P61_cn(a3)
  1725.     lsl    #3,d0
  1726.     move.l    P61_positionbase(pc),a1
  1727.     add.l    d0,a1
  1728.  
  1729.     move    (a1)+,d0
  1730.     lea    (a4,d0.l),a2
  1731.     move.l    a2,P61_ChaPos+P61_temp0-P61_cn(a3)
  1732.     move    (a1)+,d0
  1733.     lea    (a4,d0.l),a2
  1734.     move.l    a2,P61_ChaPos+P61_temp1-P61_cn(a3)
  1735.     move    (a1)+,d0
  1736.     lea    (a4,d0.l),a2
  1737.     move.l    a2,P61_ChaPos+P61_temp2-P61_cn(a3)
  1738.     move    (a1),d0
  1739.     add.l    d0,a4
  1740.     move.l    a4,P61_ChaPos+P61_temp3-P61_cn(a3)
  1741.     rts
  1742.  
  1743.     ifne    P61_tp
  1744. P61_settoneport
  1745.     move.b    P61_Info(a5),d0
  1746.     beq.b    P61_toponochange
  1747.     move.b    d0,P61_TPSpeed+1(a5)
  1748. P61_toponochange
  1749.     moveq    #$7e,d0
  1750.     and.b    (a5),d0
  1751.     beq    P61_nocha
  1752.     add    P61_Fine(a5),d0
  1753.     move    d0,P61_Note(a5)
  1754.     move    (a2,d0),P61_ToPeriod(a5)
  1755.     bra    P61_nocha
  1756.     endc
  1757.  
  1758.     ifne    P61_sof
  1759. P61_sampleoffse
  1760.     moveq    #0,d1
  1761.     move    #$ff00,d1
  1762.     and    2(a5),d1
  1763.     bne.b    .deq
  1764.     move    P61_LOffset(a5),d1
  1765. .deq    move    d1,P61_LOffset(a5)
  1766.     add    d1,P61_Offset(a5)
  1767.  
  1768.     moveq    #$7e,d0
  1769.     and.b    (a5),d0
  1770.     beq    P61_nocha
  1771.  
  1772.     move    P61_Offset(a5),d2
  1773.     add    d1,P61_Offset(a5)        ; THIS IS A PT-FEATURE!
  1774.     move    d2,d1
  1775.  
  1776.     ifne    P61_vib
  1777.     clr.b    P61_VibPos(a5)
  1778.     endc
  1779.     ifne    P61_tre
  1780.     clr.b    P61_TrePos(a5)
  1781.     endc
  1782.  
  1783.     ifne    P61_ft
  1784.     add    P61_Fine(a5),d0
  1785.     endc
  1786.     move    d0,P61_Note(a5)
  1787.     move    (a2,d0),P61_Period(a5)
  1788.     bra.b    P61_hup
  1789.  
  1790. P61_pek    moveq    #0,d1
  1791.     move    P61_Offset(a5),d1
  1792. P61_hup    or    P61_DMABit(a5),d4
  1793.     move    d4,$96(a6)
  1794.     move.l    P61_Sample(a5),a1        ;* Trigger *
  1795.     move.l    (a1)+,d0
  1796.     add.l    d1,d0
  1797.     move.l    d0,(a4)                ;Pointer
  1798.     lsr    #1,d1
  1799.     move    (a1),d0
  1800.     sub    d1,d0
  1801.     bpl.b    P61_offok
  1802.     move.l    -4(a1),(a4)            ;Pointer is over the end
  1803.     moveq    #1,d0
  1804. P61_offok
  1805.     move    d0,4(a4)            ;Length
  1806.     bra    P61_nocha
  1807.     endc
  1808.  
  1809.     ifne    P61_vl
  1810. P61_volum
  1811.     move.b    P61_Info(a5),P61_Volume+1(a5)
  1812.     bra    P61_fxdone
  1813.     endc
  1814.  
  1815.     ifne    P61_pj
  1816. P61_posjmp
  1817.     moveq    #0,d0
  1818.     move.b    P61_Info(a5),d0
  1819.     cmp    P61_slen-P61_cn(a3),d0
  1820.     blo.b    .e
  1821.     moveq    #0,d0
  1822. .e    move    d0,P61_Pos-P61_cn(a3)
  1823.     add.l    P61_possibase(pc),d0
  1824.     move.l    d0,P61_spos-P61_cn(a3)
  1825.     endc
  1826.  
  1827.     ifne    P61_pb
  1828. P61_pattbreak
  1829.     moveq    #64,d0
  1830.     move    d0,P61_rowpos-P61_cn(a3)
  1831.     clr    P61_CRow-P61_cn(a3)
  1832.     move.l    P61_spos(pc),a1
  1833.     move.l    P61_patternbase(pc),a0
  1834.     addq    #1,P61_Pos-P61_cn(a3)
  1835.     move.b    (a1)+,d0
  1836.     bpl.b    P61_dk2
  1837.     move.l    P61_possibase(pc),a1
  1838.     move.b    (a1)+,d0
  1839.     clr    P61_Pos-P61_cn(a3)
  1840. P61_dk2    move.l    a1,P61_spos-P61_cn(a3)
  1841.     move.l    P61_positionbase(pc),a1
  1842.     move    d0,P61_Patt-P61_cn(a3)
  1843.     lsl    #3,d0
  1844.     add.l    d0,a1
  1845.     movem    (a1),d0-d3
  1846.     lea    (a0,d0.l),a1
  1847.     move    d1,d0
  1848.     move.l    a1,P61_ChaPos+P61_temp0-P61_cn(a3)
  1849.     lea    (a0,d0.l),a1
  1850.     move.l    a1,P61_ChaPos+P61_temp1-P61_cn(a3)
  1851.     move    d2,d0
  1852.     lea    (a0,d0.l),a1
  1853.     move.l    a1,P61_ChaPos+P61_temp2-P61_cn(a3)
  1854.     move    d3,d0
  1855.     add.l    d0,a0
  1856.     move.l    a0,P61_ChaPos+P61_temp3-P61_cn(a3)
  1857.     bra    P61_fxdone
  1858.     endc
  1859.  
  1860.     ifne    P61_vib
  1861. P61_vibrato
  1862.     move.b    P61_Info(a5),d0
  1863.     beq    P61_fxdone
  1864.     move.b    d0,d1
  1865.     move.b    P61_VibCmd(a5),d2
  1866.     and.b    #$f,d0
  1867.     beq.b    P61_vibskip
  1868.     and.b    #$f0,d2
  1869.     or.b    d0,d2
  1870. P61_vibskip
  1871.     and.b    #$f0,d1
  1872.     beq.b    P61_vibskip2
  1873.     and.b    #$f,d2
  1874.     or.b    d1,d2
  1875. P61_vibskip2
  1876.     move.b    d2,P61_VibCmd(a5)
  1877.     bra    P61_fxdone
  1878.     endc
  1879.  
  1880.     ifne    P61_tre
  1881. P61_settremo
  1882.     move.b    P61_Info(a5),d0
  1883.     beq    P61_fxdone
  1884.     move.b    d0,d1
  1885.     move.b    P61_TreCmd(a5),d2
  1886.     moveq    #$f,d3
  1887.     and.b    d3,d0
  1888.     beq.b    P61_treskip
  1889.     and.b    #$f0,d2
  1890.     or.b    d0,d2
  1891. P61_treskip
  1892.     and.b    #$f0,d1
  1893.     beq.b    P61_treskip2
  1894.     and.b    d3,d2
  1895.     or.b    d1,d2
  1896. P61_treskip2
  1897.     move.b    d2,P61_TreCmd(a5)
  1898.     bra    P61_fxdone
  1899.     endc
  1900.  
  1901.     ifne    P61_ec
  1902. P61_ecommands
  1903.     move.b    P61_Info(a5),d0
  1904.     and.b    #$f0,d0
  1905.     lsr    #3,d0
  1906.     move    P61_etab(pc,d0),d0
  1907.     jmp    P61_etab(pc,d0)
  1908.  
  1909. P61_etab
  1910.     ifne    P61_fi
  1911.     dc    P61_filter-P61_etab
  1912.     else
  1913.     dc    P61_fxdone-P61_etab
  1914.     endc
  1915.  
  1916.     ifne    P61_fsu
  1917.     dc    P61_fineup-P61_etab
  1918.     else
  1919.     dc    P61_fxdone-P61_etab
  1920.     endc
  1921.  
  1922.     ifne    P61_fsd
  1923.     dc    P61_finedwn-P61_etab
  1924.     else
  1925.     dc    P61_fxdone-P61_etab
  1926.     endc
  1927.  
  1928.     dc    P61_fxdone-P61_etab
  1929.     dc    P61_fxdone-P61_etab
  1930.  
  1931.     ifne    P61_sft
  1932.     dc    P61_setfinetune-P61_etab
  1933.     else
  1934.     dc    P61_fxdone-P61_etab
  1935.     endc
  1936.  
  1937.     ifne    P61_pl
  1938.     dc    P61_patternloop-P61_etab
  1939.     else
  1940.     dc    P61_fxdone-P61_etab
  1941.     endc
  1942.  
  1943.     dc    P61_fxdone-P61_etab
  1944.  
  1945.     ifne    P61_timing
  1946.     dc    P61_sete8-P61_etab
  1947.     else
  1948.     dc    P61_fxdone-P61_etab
  1949.     endc
  1950.  
  1951.     ifne    P61_rt
  1952.     dc    P61_setretrig-P61_etab
  1953.     else
  1954.     dc    P61_fxdone-P61_etab
  1955.     endc
  1956.  
  1957.     ifne    P61_fvu
  1958.     dc    P61_finevup-P61_etab
  1959.     else
  1960.     dc    P61_fxdone-P61_etab
  1961.     endc
  1962.  
  1963.     ifne    P61_fvd
  1964.     dc    P61_finevdwn-P61_etab
  1965.     else
  1966.     dc    P61_fxdone-P61_etab
  1967.     endc
  1968.  
  1969.     dc    P61_fxdone-P61_etab
  1970.  
  1971.     ifne    P61_nd
  1972.     dc    P61_ndelay-P61_etab
  1973.     else
  1974.     dc    P61_fxdone-P61_etab
  1975.     endc
  1976.  
  1977.     ifne    P61_pde
  1978.     dc    P61_pattdelay-P61_etab
  1979.     else
  1980.     dc    P61_fxdone-P61_etab
  1981.     endc
  1982.  
  1983.     ifne    P61_il
  1984.     dc    P61_funk-P61_etab
  1985.     else
  1986.     dc    P61_fxdone-P61_etab
  1987.     endc
  1988.     endc
  1989.  
  1990.     ifne    P61_fi
  1991. P61_filter
  1992.     move.b    P61_Info(a5),d0
  1993.     and.b    #$fd,$bfe001
  1994.     or.b    d0,$bfe001
  1995.     bra    P61_fxdone
  1996.     endc
  1997.  
  1998.     ifne    P61_fsu
  1999. P61_fineup
  2000.     P61_getnote
  2001.  
  2002.     moveq    #$f,d0
  2003.     and.b    P61_Info(a5),d0
  2004.     sub    d0,P61_Period(a5)
  2005.     moveq    #113,d0
  2006.     cmp    P61_Period(a5),d0
  2007.     ble.b    .jup
  2008.     move    d0,P61_Period(a5)
  2009. .jup    moveq    #$7e,d0
  2010.     and.b    (a5),d0
  2011.     bne    P61_zample
  2012.     bra    P61_nocha
  2013.     endc
  2014.  
  2015.     ifne    P61_fsd
  2016. P61_finedwn
  2017.     P61_getnote
  2018.  
  2019.     moveq    #$f,d0
  2020.     and.b    P61_Info(a5),d0
  2021.     add    d0,P61_Period(a5)
  2022.     cmp    #856,P61_Period(a5)
  2023.     ble.b    .jup
  2024.     move    #856,P61_Period(a5)
  2025. .jup    moveq    #$7e,d0
  2026.     and.b    (a5),d0
  2027.     bne    P61_zample
  2028.     bra    P61_nocha
  2029.     endc
  2030.  
  2031.     ifne    P61_sft
  2032. P61_setfinetune
  2033.     moveq    #$f,d0
  2034.     and.b    P61_Info(a5),d0
  2035.     ifeq    opt020
  2036.     add    d0,d0
  2037.     move    P61_mulutab(pc,d0),P61_Fine(a5)
  2038.     else
  2039.     move    P61_mulutab(pc,d0*2),P61_Fine(a5)
  2040.     endc
  2041.     bra    P61_fxdone
  2042.  
  2043. P61_mulutab
  2044.     dc    0,74,148,222,296,370,444,518,592,666,740,814,888,962,1036,1110
  2045.     endc
  2046.  
  2047.     ifne    P61_pl
  2048. P61_patternloop
  2049.     moveq    #$f,d0
  2050.     and.b    P61_Info(a5),d0
  2051.     beq.b    P61_setloop
  2052.  
  2053.     tst.b    P61_plflag-P61_cn(a3)
  2054.     bne.b    P61_noset
  2055.  
  2056.     move    d0,P61_plcount-P61_cn(a3)
  2057.     st.b    P61_plflag-P61_cn(a3)
  2058. P61_noset
  2059.     tst    P61_plcount-P61_cn(a3)
  2060.     bne.b    P61_looppaa
  2061.     clr.b    P61_plflag-P61_cn(a3)
  2062.     bra    P61_fxdone
  2063.     
  2064. P61_looppaa
  2065.     st.b    P61_plflag+1-P61_cn(a3)
  2066.     subq    #1,P61_plcount-P61_cn(a3)
  2067.     bra    P61_fxdone
  2068.  
  2069. P61_setloop
  2070.     tst.b    P61_plflag-P61_cn(a3)
  2071.     bne    P61_fxdone
  2072.     move    P61_rowpos(pc),P61_plrowpos-P61_cn(a3)
  2073.     lea    P61_temp0+P61_TData(pc),a1
  2074.     lea    P61_looppos(pc),a0
  2075.     moveq    #channels-1,d0
  2076. .talt    move.l    (a1)+,(a0)+
  2077.     move.l    (a1)+,(a0)+
  2078.     move.l    (a1),(a0)+
  2079.     subq.l    #8,a1
  2080.     add.l    d6,a1
  2081.     dbf    d0,.talt
  2082.     bra    P61_fxdone
  2083.     endc
  2084.  
  2085.     ifne    P61_fvu
  2086. P61_finevup
  2087.     moveq    #$f,d0
  2088.     and.b    P61_Info(a5),d0
  2089.     add    d0,P61_Volume(a5)
  2090.     moveq    #64,d0
  2091.     cmp    P61_Volume(a5),d0
  2092.     bge    P61_fxdone
  2093.     move    d0,P61_Volume(a5)
  2094.     bra    P61_fxdone
  2095.     endc
  2096.  
  2097.     ifne    P61_fvd
  2098. P61_finevdwn
  2099.     moveq    #$f,d0
  2100.     and.b    P61_Info(a5),d0
  2101.     sub    d0,P61_Volume(a5)
  2102.     bpl    P61_fxdone
  2103.     clr    P61_Volume(a5)
  2104.     bra    P61_fxdone
  2105.     endc
  2106.  
  2107.     ifne    P61_timing
  2108. P61_sete8
  2109.     moveq    #$f,d0
  2110.     and.b    P61_Info(a5),d0
  2111.     move    d0,P61_E8-P61_cn(a3)
  2112.     bra    P61_fxdone
  2113.     endc
  2114.  
  2115.     ifne    P61_rt
  2116. P61_setretrig
  2117.     moveq    #$f,d0
  2118.     and.b    P61_Info(a5),d0
  2119.     move    d0,P61_RetrigCount(a5)
  2120.     bra    P61_fxdone
  2121.     endc
  2122.  
  2123.     ifne    P61_nd
  2124. P61_ndelay
  2125.     moveq    #$7e,d0
  2126.     and.b    (a5),d0
  2127.     beq    P61_skip
  2128.     ifne    P61_vib
  2129.     clr.b    P61_VibPos(a5)
  2130.     endc
  2131.     ifne    P61_tre
  2132.     clr.b    P61_TrePos(a5)
  2133.     endc
  2134.     ifne    P61_ft
  2135.     add    P61_Fine(a5),d0
  2136.     endc
  2137.     move    d0,P61_Note(a5)
  2138.     move    (a2,d0),P61_Period(a5)
  2139.     ifeq    fade
  2140.     move    P61_Volume(a5),8(a4)
  2141.     else
  2142.     move    P61_Volume(a5),P61_Shadow(a5)
  2143.     endc
  2144.     bra    P61_skip
  2145.     endc
  2146.  
  2147.     ifne    P61_pde
  2148. P61_pattdelay
  2149.     moveq    #$f,d0
  2150.     and.b    P61_Info(a5),d0
  2151.     move    d0,P61_pdelay-P61_cn(a3)
  2152.     st    P61_pdflag-P61_cn(a3)
  2153.     bra    P61_fxdone
  2154.     endc
  2155.  
  2156.     ifne    P61_sd
  2157. P61_cspeed
  2158.     moveq    #0,d0
  2159.     move.b    P61_Info(a5),d0
  2160.  
  2161.     ifne    CIA
  2162.     tst    P61_Tempo-P61_cn(a3)
  2163.     beq.b    P61_VBlank
  2164.     cmp.b    #32,d0
  2165.     bhs.b    P61_STempo
  2166.     endc
  2167.  
  2168. P61_VBlank
  2169.     cmp.b    #1,d0
  2170.     beq.b    P61_jkd
  2171.  
  2172.     move.b    d0,P61_speed+1-P61_cn(a3)
  2173.     subq.b    #1,d0
  2174.     move.b    d0,P61_speed2+1-P61_cn(a3)
  2175.     clr    P61_speedis1-P61_cn(a3)
  2176.     bra    P61_fxdone
  2177.  
  2178. P61_jkd    move.b    d0,P61_speed+1-P61_cn(a3)
  2179.     move.b    d0,P61_speed2+1-P61_cn(a3)
  2180.     st    P61_speedis1-P61_cn(a3)
  2181.     bra    P61_fxdone
  2182.  
  2183.  
  2184.     ifne    CIA
  2185. P61_STempo
  2186.     move.l    P61_timer(pc),d1
  2187.     divu    d0,d1
  2188.     move    d1,P61_thi2-P61_cn(a3)
  2189.     sub    #$1f0*2,d1
  2190.     move    d1,P61_thi-P61_cn(a3)
  2191.  
  2192.     ifeq    system
  2193.     move    P61_thi2-P61_cn(a3),d1
  2194.     move.b    d1,$bfd400
  2195.     lsr    #8,d1
  2196.     move.b    d1,$bfd500
  2197.     endc
  2198.  
  2199.     bra    P61_fxdone
  2200.     endc
  2201.     endc
  2202.  
  2203.  
  2204.  
  2205.     ifne    P61_vbvs
  2206. P61_vibochvslide
  2207.     move.b    P61_Info(a5),d0
  2208.     sub.b    d0,P61_Volume+1(a5)
  2209.     bpl.b    P61_test62
  2210.     clr    P61_Volume(a5)
  2211.     ifeq    fade
  2212.     clr    8(a4)
  2213.     else
  2214.     clr    P61_Shadow(a5)
  2215.     endc
  2216.     bra.b    P61_vib2
  2217. P61_test62
  2218.     moveq    #64,d0
  2219.     cmp    P61_Volume(a5),d0
  2220.     bge.b    .ncs2
  2221.     move    d0,P61_Volume(a5)
  2222. .ncs2
  2223.     ifeq    fade
  2224.     move    P61_Volume(a5),8(a4)
  2225.     else
  2226.     move    P61_Volume(a5),P61_Shadow(a5)
  2227.     endc
  2228.     endc
  2229.  
  2230.     ifne    P61_vib
  2231. P61_vib2
  2232.     move    #$f00,d0
  2233.     move    P61_VibCmd(a5),d1
  2234.     and    d1,d0
  2235.     lsr    #3,d0
  2236.  
  2237.     lsr    #2,d1
  2238.     and    #$1f,d1
  2239.     add    d1,d0
  2240.  
  2241.     move    P61_Period(a5),d1
  2242.     moveq    #0,d2
  2243.     move.b    P61_vibtab(pc,d0),d2
  2244.  
  2245.     tst.b    P61_VibPos(a5)
  2246.     bmi.b    .vibneg
  2247.     add    d2,d1
  2248.     bra.b    P61_vib4
  2249.  
  2250. .vibneg    sub    d2,d1
  2251.  
  2252. P61_vib4
  2253.     move    d1,6(a4)
  2254.     move.b    P61_VibCmd(a5),d0
  2255.     lsr.b    #2,d0
  2256.     and    #$3c,d0
  2257.     add.b    d0,P61_VibPos(a5)
  2258.     bra    P61_contfxdone
  2259.     endc
  2260.  
  2261.     ifne    P61_tre
  2262. P61_tremo
  2263.     move    #$f00,d0
  2264.     move    P61_TreCmd(a5),d1
  2265.     and    d1,d0
  2266.     lsr    #3,d0
  2267.     
  2268.     lsr    #2,d1
  2269.     and    #$1f,d1
  2270.     add    d1,d0
  2271.  
  2272.     move    P61_Volume(a5),d1
  2273.     moveq    #0,d2
  2274.     move.b    P61_vibtab(pc,d0),d2
  2275.  
  2276.     tst.b    P61_TrePos(a5)
  2277.     bmi.b    .treneg
  2278.     add    d2,d1
  2279.     cmp    #64,d1
  2280.     ble.b    P61_tre4
  2281.     moveq    #64,d1
  2282.     bra.b    P61_tre4
  2283.  
  2284. .treneg    sub    d2,d1
  2285.     bpl.b    P61_tre4
  2286.     moveq    #0,d1
  2287. P61_tre4
  2288.     ifeq    fade
  2289.     move    d1,8(a4)
  2290.     else
  2291.     move    d1,P61_Shadow(a5)
  2292.     endc
  2293.  
  2294.     move.b    P61_TreCmd(a5),d0
  2295.     lsr.b    #2,d0
  2296.     and    #$3c,d0
  2297.     add.b    d0,P61_TrePos(a5)
  2298.     bra    P61_contfxdone
  2299.     endc
  2300.  
  2301.     ifne    P61_vib!P61_tre
  2302. P61_vibtab    incbin    vibtab
  2303.     endc
  2304.  
  2305.     ifne    P61_il
  2306. P61_funk
  2307.     moveq    #$f,d0
  2308.     and.b    P61_Info(a5),d0
  2309.     move.b    d0,P61_Funkspd(a5)
  2310.     bra    P61_fxdone
  2311.  
  2312. P61_funk2
  2313.     moveq    #0,d0
  2314.     move.b    P61_Funkspd(a5),d0
  2315.     beq.b    P61_funkend
  2316.     move.b    P61_FunkTable(pc,d0),d0
  2317.     add.b    d0,P61_Funkoff(a5)
  2318.     bpl.b    P61_funkend
  2319.     clr.b    P61_Funkoff(a5)
  2320.  
  2321.     move.l    P61_Sample(a5),a1
  2322.     move.l    P61_RepeatOffset(a1),d1
  2323.     move    P61_RepeatLength(a1),d0
  2324.     add.l    d0,d0
  2325.     add.l    d1,d0
  2326.     move.l    P61_Wave(a5),a0
  2327.     addq.l    #1,a0
  2328.     cmp.l    d0,a0
  2329.     blo.b    P61_funkok
  2330.     move.l    d1,a0
  2331. P61_funkok
  2332.     move.l    a0,P61_Wave(a5)
  2333.     not.b    (a0)
  2334. P61_funkend
  2335.     rts
  2336.  
  2337. P61_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  2338.     endc
  2339.  
  2340. P61_jtab
  2341.     dc    P61_fxdone-*
  2342.     dc    P61_fxdone-*
  2343.     dc    P61_fxdone-*
  2344.  
  2345.     ifne    P61_tp
  2346.     dc    P61_settoneport-*
  2347.     else
  2348.     dc    P61_fxdone-*
  2349.     endc
  2350.  
  2351.     ifne    P61_vib
  2352.     dc    P61_vibrato-*
  2353.     else
  2354.     dc    P61_fxdone-*
  2355.     endc
  2356.  
  2357.     ifne    P61_tpvs
  2358.     dc    P61_toponochange-*
  2359.     else
  2360.     dc    P61_fxdone-*
  2361.     endc
  2362.  
  2363.     dc    P61_fxdone-*
  2364.  
  2365.     ifne    P61_tre
  2366.     dc    P61_settremo-*
  2367.     else
  2368.     dc    P61_fxdone-*
  2369.     endc
  2370.  
  2371.     dc    P61_fxdone-*
  2372.  
  2373.     ifne    P61_sof
  2374.     dc    P61_sampleoffse-*
  2375.     else
  2376.     dc    P61_fxdone-*
  2377.     endc
  2378.     dc    P61_fxdone-*
  2379.  
  2380.     ifne    P61_pj
  2381.     dc    P61_posjmp-*
  2382.     else
  2383.     dc    P61_fxdone-*
  2384.     endc
  2385.  
  2386.     ifne    P61_vl
  2387.     dc    P61_volum-*
  2388.     else
  2389.     dc    P61_fxdone-*
  2390.     endc
  2391.  
  2392.     ifne    P61_pb
  2393.     dc    P61_pattbreak-*
  2394.     else
  2395.     dc    P61_fxdone-*
  2396.     endc
  2397.  
  2398.     ifne    P61_ec
  2399.     dc    P61_ecommands-*
  2400.     else
  2401.     dc    P61_fxdone-*
  2402.     endc
  2403.     
  2404.     ifne    P61_sd
  2405.     dc    P61_cspeed-*
  2406.     else
  2407.     dc    P61_fxdone-*
  2408.     endc
  2409.  
  2410.  
  2411. P61_dmason
  2412.     ifeq    system
  2413.     tst.b    $bfdd00
  2414.     move    #$2000,$dff09c
  2415.     move.b    #$19,$bfdf00
  2416.     move.l    a0,-(sp)
  2417.     move.l    P61_vektori(pc),a0
  2418.     move.l    P61_intaddr(pc),(a0)
  2419.     move.l    (sp)+,a0
  2420.     move    P61_dma(pc),$dff096
  2421.     nop
  2422.     rte
  2423.  
  2424.     else
  2425.  
  2426.     move    P61_dma(pc),$96(a6)
  2427.     lea    P61_server(pc),a3
  2428.     addq    #1,(a3)
  2429.     move.l    P61_craddr(pc),a0
  2430.     move.b    #$19,(a0)
  2431.     bra    P61_ohi
  2432.     endc
  2433.  
  2434.  
  2435. P61_setrepeat
  2436.     ifeq    system
  2437.     tst.b    $bfdd00
  2438.     movem.l    a0/a1,-(sp)
  2439.     lea    $dff0a0,a1
  2440.     move    #$2000,-4(a1)
  2441.     else
  2442.     lea    $a0(a6),a1
  2443.     endc
  2444.  
  2445.     move.l    P61_Sample+P61_temp0(pc),a0
  2446.     addq.l    #6,a0
  2447.     move.l    (a0)+,(a1)+
  2448.     move    (a0),(a1)
  2449.  
  2450.     ifgt    channels-1
  2451.     move.l    P61_Sample+P61_temp1(pc),a0
  2452.     addq.l    #6,a0
  2453.     move.l    (a0)+,12(a1)
  2454.     move    (a0),16(a1)
  2455.     endc
  2456.     
  2457.     ifgt    channels-2
  2458.     move.l    P61_Sample+P61_temp2(pc),a0
  2459.     addq.l    #6,a0
  2460.     move.l    (a0)+,28(a1)
  2461.     move    (a0),32(a1)
  2462.     endc
  2463.  
  2464.     ifgt    channels-3
  2465.     move.l    P61_Sample+P61_temp3(pc),a0
  2466.     addq.l    #6,a0
  2467.     move.l    (a0)+,44(a1)
  2468.     move    (a0),48(a1)
  2469.     endc
  2470.  
  2471.     ifne    system
  2472.     ifne    CIA
  2473.     lea    P61_server(pc),a3
  2474.     clr    (a3)
  2475.     move.l    P61_craddr+4(pc),a0
  2476.     move.b    P61_tlo(pc),(a0)
  2477.     move.b    P61_thi(pc),$100(a0)
  2478.     endc
  2479.     bra    P61_ohi
  2480.     endc
  2481.  
  2482.     ifeq    system
  2483.     ifne    CIA
  2484.     move.l    P61_vektori(pc),a0
  2485.     move.l    P61_tintti(pc),(a0)
  2486.     endc
  2487.     movem.l    (sp)+,a0/a1
  2488.     nop
  2489.     rte
  2490.     endc
  2491.  
  2492. P61_temp0    dcb.b    Channel_Block_SIZE-2
  2493.         dc    1
  2494.  
  2495. P61_temp1    dcb.b    Channel_Block_SIZE-2
  2496.         dc    2
  2497.  
  2498. P61_temp2    dcb.b    Channel_Block_SIZE-2
  2499.         dc    4
  2500.  
  2501. P61_temp3    dcb.b    Channel_Block_SIZE-2
  2502.         dc    8
  2503.  
  2504. P61_cn        dc    0
  2505. P61_dma        dc    $8200
  2506. P61_rowpos    dc    0
  2507. P61_slen    dc    0
  2508. P61_speed    dc    0
  2509. P61_speed2    dc    0
  2510. P61_speedis1    dc    0
  2511. P61_spos    dc.l    0
  2512.  
  2513.     ifeq    system
  2514. P61_vektori    dc.l    0
  2515. P61_oldlev6    dc.l    0
  2516.     endc
  2517.  
  2518. P61_ofilter    dc    0
  2519. P61_timers    dc.l    0
  2520.  
  2521.     ifne    CIA
  2522. P61_tintti    dc.l    0
  2523. P61_thi        dc.b    0
  2524. P61_tlo        dc.b    0
  2525. P61_thi2    dc.b    0
  2526. P61_tlo2    dc.b    0
  2527. P61_timer    dc.l    0
  2528.     endc
  2529.  
  2530.     ifne    P61_pl
  2531. P61_plcount    dc    0
  2532. P61_plflag    dc    0
  2533. P61_plreset    dc    0
  2534. P61_plrowpos    dc    0
  2535. P61_looppos    dcb.b    12*channels
  2536.     endc
  2537.  
  2538.     ifne    P61_pde
  2539. P61_pdelay    dc    0
  2540. P61_pdflag    dc    0
  2541.     endc
  2542.  
  2543. P61_samples    dcb.b    16*31
  2544. P61_emptysample    dcb.b    16
  2545. P61_positionbase dc.l    0
  2546. P61_possibase    dc.l    0
  2547. P61_patternbase    dc.l    0
  2548. P61_intaddr    dc.l    0
  2549.  
  2550.     ifne    system
  2551. P61_server    dc    0
  2552. P61_miscbase    dc.l    0
  2553. P61_audioopen    dc.b    0
  2554. P61_sigbit    dc.b    -1
  2555. P61_ciares    dc.l    0
  2556. P61_craddr    dc.l    0,0,0
  2557. P61_dat        dc    $f00
  2558. P61_timerinterrupt dc    0,0,0,0,127
  2559. P61_timerdata    dc.l    0,0,0
  2560. P61_timeron    dc    0
  2561. P61_allocport    dc.l    0,0
  2562.         dc.b    4,0
  2563.         dc.l    0
  2564.         dc.b    0,0
  2565.         dc.l    0
  2566. P61_reqlist    dc.l    0,0,0
  2567.         dc.b    5,0
  2568. P61_allocreq    dc.l    0,0
  2569.         dc    127
  2570.         dc.l    0
  2571. P61_portti    dc.l    0
  2572.         dc    68
  2573.         dc.l    0,0,0
  2574.         dc    0
  2575. P61_reqdata    dc.l    0
  2576.         dc.l    1,0,0,0,0,0,0
  2577.         dc    0
  2578. P61_audiodev    dc.b    'audio.device',0
  2579.  
  2580. P61_cianame    dc.b    'ciab.resource',0
  2581. P61_timeropen    dc.b    0
  2582. P61_timerint    dc.b    'P61_TimerInterrupt',0,0
  2583.     endc
  2584. P61_etu
  2585.  
  2586.  
  2587. ******** END OF BINARY FILE **************
  2588.  
  2589.     section    chip,data_c
  2590. P61_data    incbin    "P61:P61.stay cool..."
  2591. ;P61_smp    incbin    "ram:SMP.fields of green"
  2592.  
  2593.     section    smp,bss_c
  2594. samples    ;ds.b    $10000        ;uncomment if you have packed samples
  2595.                 ;and insert sample buffer length
  2596.